/**
 * @ProjectName: go-learn-demo
 * @PackageName: ginybxb
 * @Description:
 * @Author: hy.bai
 * @Date: 2025-08-03 12:19
 */
package ginybxb

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"log/slog"
)

// 自定义中间件
// 特点:方法的返回值类型是: func(ctx gin.Context)
func CustomMiddleware() gin.HandlerFunc {
	return func(ctx *gin.Context) {
		fmt.Println("CustomMiddleware:我是一个中间件")
	}
}

// 定义一个中间件函数，
// 使用的是闭包
// 返回一个gin.HandlerFunc的函数，在函数内定义任意的操作
// 这个函数与业务的handler是相同的类型，所以可以被放到同一个Handler链表中，注册好之后，会先执行中间件，在执行请求处理Handler。
func ybxbMiddleware(num int) gin.HandlerFunc {
	fmt.Println("外部执行:", num)
	// 注意：这里的执行是服务启动时，并不是通过浏览器访问请求时，
	// 浏览器请求时，只会执行返回值的gin.HandlerFunc类型函数。
	return func(context *gin.Context) {
		fmt.Println("ybxbMiddleware:我是一个中间件")
	}
}

// 用于处理"/hello"请求
func HandlerHello(ctx *gin.Context) {
	data := "hello world"
	ginHandleResp(ctx, 2000, "操作成功", data)
}

func TestMiddleware() {
	// 1.初始gin对象
	r := gin.Default()
	// 注册中间件。定义全局中间件，会处理所有请求
	// 全局中间件：在Use方法之后注册的服务，全部都会自动加上这个中间件，都会生效。
	r.Use(CustomMiddleware())
	// 2.注册服务
	// 定义局部中间件，只会在当前的请求地址中，才会执行。
	r.GET("/hello", ybxbMiddleware(123), HandlerHello)
	// 3.启动服务
	if err := r.Run(":8080"); err != nil {
		slog.Error(fmt.Sprintf("服务启动失败, 原因是:%s", err.Error()))
	}
}
